#ifndef EASYAI_JCANNX_INCLUDE_COMMON_H_
#define EASYAI_JCANNX_INCLUDE_COMMON_H_

#include <iostream>
#include <vector>
#include "acl/acl.h"
#include "aclnnop/aclnn_matmul.h"

#define CHECK_RET(cond, return_expr) \
  do {                               \
    if (!(cond)) {                   \
      return_expr;                   \
    }                                \
  } while (0)

#define LOG_PRINT(message, ...)     \
  do {                              \
    printf(message, ##__VA_ARGS__); \
  } while (0)

namespace common {

/**
 * 计算给定形状的元素总数。
 *
 * 该函数遍历形状向量中的所有维度大小，并将它们相乘，
 * 得到多维数组（如张量）的总元素数量。
 *
 * @param shape 一个表示张量或数组各维度大小的 int64_t 向量。
 * @return 返回形状中所有维度大小的乘积，即元素总数。
 */
int64_t GetShapeSize(const std::vector<int64_t>& shape);

/**
 * 初始化资源
 * 
 * @param  deviceId
 * @param  stream
 * @return          
 */
int Init(int32_t deviceId, aclrtStream* stream);

/**
 * 创建AclTensor
 * @param  array      
 * @param  shape      
 * @param  deviceAddr 
 * @param  dataType   
 * @param  tensor     
 * @return            
 */
int CreateAclTensor(const float* array, const std::vector<int64_t>& shape, void** deviceAddr, aclDataType dataType, aclTensor** tensor);


/**
 * 释放资源
 * @param  deviceId 
 * @param  stream   
 * @return          
 */
int Destroy(int32_t deviceId, aclrtStream* stream);

}

#endif